home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_10_08
/
1008048a
< prev
next >
Wrap
Text File
|
1992-05-13
|
4KB
|
104 lines
/* Listing 1 */
/*****************************************************
Name: SRF_TRNS.C
Description: Library of functions for the
rotation and translation of
surface equation coefficients
Global Function List: srf_rotate, srf_trans
Portability: Standard C
*****************************************************/
#include <stdlib.h>
#include <srf_trns.h>
/*****************************************************
Name: srf_rotate
Parameters: Co - 4x4 matrix of original coefficients
Cr - 4x4 matrix of rotated coefficients
R - 3x3 matrix of coordinant rotation of
new system with respect to the original
Description: Rotate a surface by a given coordinant
transformation. Second order surfaces
are in the form,
0 = C00 + C01x + C02y + C03z + C11x² +
C22y² + C33z² + C12xy + C23yz + C13xz
First order are in the form,
0 = C00 + C01x + C02y + C03z
*****************************************************/
void srf_rotate( double **Co, double **Cr,
double **R )
{
size_t i, j, k, m;
/* Get the constant term. */
Cr[0][0] = Co[0][0];
/* The squared terms. C11, C22, C33 */
for ( i = 1; i < 4; i++ )
for ( j = 1; j < 4; j++ )
for ( k = 1; k < 4; k++ )
Cr[i][i] += R[i - 1][j - 1] *
R[i - 1][k - 1] * Co[j][k];
/* The mixed terms. C12, C13, C23 */
for ( i = 1; i < 4; i++ )
for ( j = i + 1; j < 4; j++ )
for ( k = 1; k < 4; k++ )
for ( m = 1; m < 4; m++ )
Cr[i][j] += R[i - 1][k - 1] *
R[j - 1][m - 1] *
Co[k][m] *
(( k == m ) ? 2 : 1 );
/* The linear terms. C01, C02, C03 */
for ( i = 1; i < 4; i++ )
for ( j = 1; j < 4; j++ )
Cr[0][i] += R[i - 1][j - 1] * Co[0][j];
/* Fill up the diagonals, make matrix symetric */
for ( i = 0; i < 4; i++ )
for ( j = i + 1; j < 4; j++ )
Cr[j][i] = Cr[i][j];
} /* function surf_rotate */
/*****************************************************
Name: srf_trans
Parameters: Co - 4x4 matrix of original coefficients
T - array of translation vector
Return: Co is modified
Description: Translate a surface by a given distance
vector. The distance vector is defined
the the coordinate system the surface is
currently in. Second order surfaces
are in the form,
0 = C00 + C01x + C02y + C03z + C11x² +
C22y² + C33z² + C12xy + C23yz + C13xz
First order are in the form,
0 = C00 + C01x + C02y + C03z
*****************************************************/
void srf_trans( double **Co, double *T )
{
size_t i, j;
/* Get the constant term. C00 */
for ( i = 0; i < 4; i++ )
for ( j = i; j < 4; j++ )
Co[0][0] += (( i == 0 ) ? 1.0 :
T[i - 1] ) * (( j == 0 ) ? 0.0 :
T[j - 1] ) * Co[i][j];
/* Get the single terms. C01, C02, C03 */
for ( i = 1; i < 4; i++ )
for ( j = 1; j < 4; j++ )
Co[0][i] += T[j - 1] * Co[j][i] *
(( i == j ) ? 2.0 : 1.0 );
/* Fill up the diagonals, make matrix symetric */
for ( i = 0; i < 4; i++ )
for ( j = i + 1; j < 4; j++ )
Co[j][i] = Co[i][j];
} /* function surf_tran */
/* End of File */